package sessionbeans;


import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.security.RolesAllowed;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.xml.crypto.Data;

import supportClass.ElementoDTO;
import supportClass.IstanzaDTO;
import supportClass.PacchettoDTO;
import supportClass.UtenteDTO;
import supportClass.ViaggioDTO;
import traveldreamEJB.Elemento;
import traveldreamEJB.Istanza;
import traveldreamEJB.Pacchetto;
import traveldreamEJB.Utente;
import traveldreamEJB.Viaggio;
import utility.Conversion;


/**
 * Session Bean implementation class ContentEAO
 */
@Stateless
public class RicercaSB implements RicercaSBLocal {

	@PersistenceContext
    private EntityManager em;
	
    /**
     * Default constructor. 
     */
    public RicercaSB() {
        // TODO Auto-generated constructor stub
    }


	
	@Override
	@RolesAllowed({"USERS", "ADMINS"})
	public List<IstanzaDTO> getAllIstEl() 
	{
		List<IstanzaDTO> istanzeDTO= new ArrayList<IstanzaDTO>();;
		List<Istanza> istanze;
		Query allIstanze = em.createNamedQuery("Istanza.findAll");
		
		istanze= allIstanze.getResultList();
		istanzeDTO= Conversion.convertIstanza(istanze);
		
		return istanzeDTO;
	}
	
	@Override
	@RolesAllowed({"USERS", "ADMINS"})
	public List<PacchettoDTO> ricercaPacchetto() 
	{
		List<PacchettoDTO> pacchettiDTO = new ArrayList<PacchettoDTO>();
		List<Pacchetto> pacchetti;
		Query allPacchetti = em.createNamedQuery("Pacchetto.findAll");
		
		pacchetti= allPacchetti.getResultList();
		pacchettiDTO= Conversion.convertiPacchetto(pacchetti);
		return pacchettiDTO;
	}
	
	@Override
	@RolesAllowed({"USERS"})
	public List<IstanzaDTO> getAllIstHotel() 
	{
		List<IstanzaDTO> istanzeDTO= new ArrayList<IstanzaDTO>();;
		List<Istanza> istanze;
		Query allIstanze = em.createNamedQuery("Istanza.findAllHotel");
		
		istanze= allIstanze.getResultList();
		istanzeDTO= Conversion.convertIstanza(istanze);
		
		return istanzeDTO;
	}
	
	@Override
	@RolesAllowed({"USERS"})
	public List<IstanzaDTO> getAllIstEscursione() 
	{
		List<IstanzaDTO> istanzeDTO= new ArrayList<IstanzaDTO>();;
		List<Istanza> istanze;
		Istanza tmp;
		Query allIstanze = em.createNamedQuery("Istanza.findAllEscursione");
		
		istanze= allIstanze.getResultList();
		istanzeDTO= Conversion.convertIstanza(istanze);
		
		return istanzeDTO;
	}
	

	@Override
	@RolesAllowed({"USERS"})
	public List<IstanzaDTO> getAllIstVolo() 
	{
		List<IstanzaDTO> istanzeDTO= new ArrayList<IstanzaDTO>();;
		List<Istanza> istanze;
		Istanza tmp;
		Query allIstanze = em.createNamedQuery("Istanza.findAllVolo");
		
		istanze= allIstanze.getResultList();
		istanzeDTO= Conversion.convertIstanza(istanze);
		
		return istanzeDTO;
	}
	
	@Override
	@RolesAllowed({"USERS", "ADMINS"})
	public List<PacchettoDTO> getAllPacchetto() 
	{
		Query allPacchetto = em.createNamedQuery("Pacchetto.findAll");
				
		return Conversion.convertiPacchetto(allPacchetto.getResultList());
	}

	@Override
	@RolesAllowed({"USERS", "ADMINS"})
	public List<String> getAllTipologia() {
		return em.createNamedQuery("Pacchetto.findAllTipologia").getResultList();
	}

	@Override
	@RolesAllowed({"USERS", "ADMINS"})
	public List<String> getAllCitta() {
		return em.createNamedQuery("Pacchetto.findAllCitta").getResultList();
	}
	
	@Override
	@RolesAllowed({"USERS"})
	public List<IstanzaDTO> getAllHotelInPacchetto(int pacchetto){
		Query hotelInPacchetto = em.createNamedQuery("Istanza.findAllHotelInPacchetto");
		hotelInPacchetto.setParameter("pacchetto",pacchetto);
		return Conversion.convertIstanza(hotelInPacchetto.getResultList());
	}

	@Override
	@RolesAllowed({"USERS"})
	public List<IstanzaDTO> getAllEscursioniInPacchetto(int idPacchetto,Date dataInizio, Date dataFine) {
		Query hotelInPacchetto = em.createNamedQuery("Istanza.findAllEscursioniInPacchetto");
		hotelInPacchetto.setParameter("pacchetto",idPacchetto);
		hotelInPacchetto.setParameter("dataInizio",dataInizio);
		hotelInPacchetto.setParameter("dataFine",dataFine);
		return Conversion.convertIstanza(hotelInPacchetto.getResultList());
	}
	
	@Override
	@RolesAllowed({"ADMINS"})
	public List<ElementoDTO> getAllElementoEscursione()
	{
		
		List<ElementoDTO> elementiDTO= new ArrayList<ElementoDTO>();;
		List<Elemento> elementi;
		Query allIstanze = em.createNamedQuery("Elemento.findAllEscursione");
		
		elementi= allIstanze.getResultList();
		
		elementiDTO= Conversion.convertElemento(elementi);
		
		return elementiDTO;
	}
	
	@Override
	@RolesAllowed({"ADMINS"})
	public List<ElementoDTO> getAllElementoHotel()
	{
		
		List<ElementoDTO> elementiDTO= new ArrayList<ElementoDTO>();;
		List<Elemento> elementi;
		Query allIstanze = em.createNamedQuery("Elemento.findAllHotel");
		
		elementi= allIstanze.getResultList();
		
		elementiDTO= Conversion.convertElemento(elementi);
		
		return elementiDTO;
	}
	
	@Override
	@RolesAllowed({"ADMINS"})
	public List<ElementoDTO> getAllElementoVolo()
	{
		
		List<ElementoDTO> elementiDTO= new ArrayList<ElementoDTO>();;
		List<Elemento> elementi;
		Query allIstanze = em.createNamedQuery("Elemento.findAllVolo");
		
		elementi= allIstanze.getResultList();
		
		elementiDTO= Conversion.convertElemento(elementi);
		
		return elementiDTO;
	}
	
	@Override
	@RolesAllowed({"ADMINS"})
	public Integer getMaxElemento()
	{
		
		Integer max;
		Query massimo  = em.createNamedQuery("Elemento.findMax");
		
		max= (Integer) massimo.getSingleResult();
		if(max != null)
			return max+1;
		else
			return 0;
	}
	
	@Override
	@RolesAllowed({"ADMINS"})
	public Integer getMaxIstanza()
	{
		
		Integer max;
		Query massimo  = em.createNamedQuery("Istanza.findMax");
		
		max= (Integer) massimo.getSingleResult();
		if(max != null)
			return max+1;
		else
			return 0;
	}
	
	@Override
	@RolesAllowed({"ADMINS"})
	public Integer getMaxPacchetto()
	{
		
		Integer max;
		Query massimo  = em.createNamedQuery("Pacchetto.findMax");
		
		max= (Integer) massimo.getSingleResult();
		if(max != null)
			return max+1;
		else
			return 0;
	}
	
	@Override
	@RolesAllowed({"ADMINS", "USERS"})
	public Integer getMaxViaggio()
	{
		
		Integer max;
		Query massimo  = em.createNamedQuery("Viaggio.findMax");
		
		max= (Integer) massimo.getSingleResult();
		if(max != null)
			return max+1;
		else
			return 0;
	}
	
	@Override
	@RolesAllowed({"ADMINS", "USERS"})
	public UtenteDTO getUtente(String email)
	{
		Query utenteByEmail = em.createNamedQuery("Utente.findUtenteByEmail");
		utenteByEmail.setParameter("email", email);
		Utente tmp = (Utente) utenteByEmail.getSingleResult();
		
		List<ViaggioDTO> viaggi = Conversion.convertiViaggi(tmp.getViaggios());
		UtenteDTO newUtenti = new UtenteDTO( tmp.getCitta(), tmp.getCognome(), tmp.getEmail(), tmp.getNome(), tmp.getTelefono(), tmp.getVia(), viaggi);
		
		return newUtenti;
	}
	
	@Override
	@RolesAllowed({"USERS"})
	public List<IstanzaDTO> getIstanzeInViaggio(Integer idViaggio)
	{
		Query viaggioById = em.createNamedQuery("Viaggio.findViaggioById");
		viaggioById.setParameter("idViaggio", idViaggio);
		Viaggio tmpViaggio= (Viaggio) viaggioById.getSingleResult();
		
		return Conversion.convertIstanza(tmpViaggio.getListaIstanze());
	}
	
	@Override
	@RolesAllowed({"USERS", "ADMINS"})
	public ViaggioDTO getViaggio(Integer idViaggio)
	{
		Viaggio tmpViaggio;
		try{
		Query viaggioById = em.createNamedQuery("Viaggio.findViaggioById");
		viaggioById.setParameter("idViaggio", idViaggio);
		tmpViaggio= (Viaggio) viaggioById.getSingleResult();
		}catch(NoResultException e){return null;}
		return Conversion.convertiViaggio(tmpViaggio);
	}

	@Override
	@RolesAllowed({"USERS"})
	public List<IstanzaDTO> getIstanzePagate(ViaggioDTO viaggio) {
		Query istanzePagateByViaggio = em.createNamedQuery("Pagamento.findIstanzePagateByViaggio");
		istanzePagateByViaggio.setParameter("idViaggio", viaggio.getIdViaggio());
		List<Istanza> tmpIstanzePagate = (List<Istanza>) istanzePagateByViaggio.getResultList();
		List<IstanzaDTO> risultato= new ArrayList<IstanzaDTO>();
		for(int i=0; i<tmpIstanzePagate.size(); i++)
		{
			if(tmpIstanzePagate.get(i)!= null)
				risultato.add(Conversion.convertIstanzaSingola(tmpIstanzePagate.get(i)));
		}
		return risultato;
	}
	
	@Override
	public boolean getUtenteBol(String email)
	{
		Query utenteByEmail = em.createNamedQuery("Utente.findUtenteByEmail");
		utenteByEmail.setParameter("email", email);
		try{
			utenteByEmail.getSingleResult();
		} catch(NoResultException e) {
			return false;
		}
		
		return true;
		
	}

	@Override
	@RolesAllowed({ "ADMINS"})
	public boolean getPacchettoBool(String citta, String tipologia) {
		// TODO Auto-generated method stub
		
		Query allPacchetti = em.createNamedQuery("Pacchetto.findAll");
		List<Pacchetto> pacchetti;
		pacchetti= allPacchetti.getResultList();
		for( int i=0; i<pacchetti.size(); i++)
			if(pacchetti.get(i).getCitta().equals(citta) && pacchetti.get(i).getTipologia().equals(tipologia))
				return true;
		
		return false;
	}
	
	@Override
	@RolesAllowed({"USERS", "ADMINS"})
	public List<PacchettoDTO> getAllPacchetto(String citta) 
	{
		Query allPacchetto = em.createNamedQuery("Pacchetto.findAllByCitta");
		allPacchetto.setParameter("citta", citta);
				
		return Conversion.convertiPacchetto(allPacchetto.getResultList());
	}

}
